#include <iostream>
#include <string>


// 继承、多态、重载等测试

class Entity
{
public:
    int x, y;

    Entity()
    {
        x = 10;
        y = 11;
    }

    Entity(int x_a,int y_a) : x(x_a),y(y_a){}
    

    void Move(int xa, int ya)
    {
        x += xa;
        y += ya;
    }

    void GetValue()
    {
        std::cout << x << "," << y << std::endl;
    }


    //virtual 关键字指出该函数支持重写,使用virtual 会造成额外的系统开销
    virtual void GetName()
    {
        std::cout << "Entity" << std::endl;
    }


};

// 继承语法: class children : public parent
// 子类继承父类的一切，包括构造方法

class Player : public Entity
{
public:
    /* data */
    std::string name;

public:
    Player() : name("SunWukong") {}
    void SetName(const char *name)
    {
        this->name = name;
    }

    //override 关键字可以用于检查拼写和参数等错误
    void GetName() override
    {
        std::cout << "Player" << std::endl;
    }
};

void Function(Entity *e)
{
    e->GetName();
}

std::ostream& operator<< (std::ostream& stream,const Player* p)
{
    stream << p->name;
    return stream;
}

int main()
{

    //new 关键字在Heap(堆)上创建对象，变量生存时间直到我们手动删除释放该内存空间
    //new 关键字返回一个指向堆空间的指针
    Player *player = new Player();
    Entity *entity = new Entity();

    // Play play;   在栈上创建对象，生命周期到花括弧结束；不需要手动释放内存空间;


    Entity e(1,2);
    return 0;
}